package Day_0202.Spring;

/**
 * @author zxc
 * @date 2023/02/02 18:10
 **/
public class Spring_AOP {
    public static void main(String[] args) {
        /**
         * SpringAOP的实现
         * ===》
         * 1.AOP（Aspect-Oriented Programming，面向切面编程）
         * （1）能够将那些与业务无关，却为业务模块所共同调用的逻辑或责任（例如事务处理、日志管理、权限控制等）封装起来，
         *  便于减少系统的重复代码，降低模块间的耦合度，并有利于未来的可扩展性和可维护性。
         *
         * （2）Spring AOP是基于动态代理的;
         *  如果要代理的对象实现了某个接口，那么Spring AOP就会使用JDK动态代理去创建代理对象；
         *  而对于没有实现接口的对象，就无法使用JDK动态代理，转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。
         *  注意：图中的implements和extend。即一个是接口，一个是实现类。
         *
         * 2.AspectJ
         * （1）Spring AOP中已经集成了AspectJ，AspectJ应该算得上是Java生态系统中最完整的AOP框架了。
         * （2）使用AOP之后我们可以把一些通用功能抽象出来，在需要用到的地方直接使用即可，这样可以大大简化代码量。
         * （3）需要增加新功能也方便，提高了系统的扩展性。日志功能、事务管理和权限管理等场景都用到了AOP
         *
         * ===》
         * 总结 ：
         * （1）AOP（面向切面编程） ：即，能够将业务模块所需要共同调用的逻辑/责任封装起来;
         * （即，AOP实现了将通用功能抽象出来，简化代码量;）
         *
         * （2）动态代理 ：（SpringAOP所独有的）
         *  a.实现了接口的对象，则使用JDK动态代理来创建代理对象（该代理对象也实现了接口）;
         *  b.为实现接口的对象，则使用CGlib动态代理来生成被代理对象的子类作为代理;
         */
    }
}
